from openpyxl import Workbook, load_workbook
from xmind_to_excel_case import settings
import os
import datetime
import hashlib


# 文件名合成类
class SynthesisFilePath:
    def get_file_path(self, file_name):
        hash = hashlib.md5()
        hash.update(str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')).encode('utf8'))
        return file_name + hash.hexdigest() + '.xlsx'  # 文件名称


# excel工具类
class ExcelTool:
    def __init__(self, file_name, write_data, status=True, titles=None, keys=None, static_path=None):
        self.wb = Workbook()  # 实例化
        self.ws = self.wb.active  # 激活 worksheet
        self.file_name = file_name  # 文件名称
        self.write_data = write_data  # 将要写入的数据
        self.titles = titles  # 表头
        self.keys = keys  # key列表，用于规范写入顺序
        self.status = status  # 是否写入后就直接删除
        # self.relative_path = os.path.join("UploadFile", file_name)  # ，需要用这个方法
        self.path = os.path.join(settings.STATIC_PATH, file_name)
        self.data = []  # 合成后的数据，直接写入excel

    # 删除文件
    def remove(self):
        if os.path.exists(self.path):
            if self.status:
                os.remove(self.path)

    # 保存数据
    def save(self):
        for row in self.data:
            self.ws.append(row)
        # if not os.path.isdir(self.static_path):
        #     os.makedirs(self.static_path)
        self.wb.save(self.path)

    # 数据合成
    def data_synthesis(self):
        # 追加表头
        for title_dict in self.titles:
            title_lis = [title_dict.get(key) for key in self.keys]
            self.data.append(title_lis)
        # 追加表体 self.write_data 应该是一个列表
        for write_dict in self.write_data:
            lis = [write_dict.get(key) for key in self.keys]
            self.data.append(lis)

    # 运行入口
    def run(self):
        self.data_synthesis()
        self.save()


# excel读取类
class ReadExcel:
    def __init__(self, **kwargs):
        """
        :param file_path:  文件路径
        :param sheet: excel的Sheet页名称
        """
        self.sheet = kwargs.get("sheet")  # excel的Sheet页名称
        self.file_path = kwargs.get("file_path")  # 文件路径获取
        self.wb = load_workbook(filename=self.file_path)  # 打开文件,默认可读写，若有需要可以指定write_only和read_only为True
        self.sheet_obj = self.get_sheet()  # 找到工作表
        self.max_row = self.sheet_obj.max_row
        self.max_column = self.sheet_obj.max_column
        self.keys = []  # 第一行
        self.excel_data = []  # 第一行与其它行组成字典存放进的列表中

    # 获取sheet对象
    def get_sheet(self):
        sheets = self.wb.sheetnames  # 获取全部sheet
        sheet_obj = self.wb[self.sheet] if self.sheet else self.wb[sheets[0]]  # 切换  sheet
        return sheet_obj

    # 遍历excel，组装数据
    def traverse_excel(self):
        for i in range(self.max_row):
            dt = {}
            for j in range(self.max_column):
                value = self.sheet_obj.cell(row=i + 1, column=j + 1).value
                if i == 0:
                    self.keys.append(value)
                else:
                    dt[self.keys[j]] = value.replace("\n", "") if isinstance(value, str) else value
            if dt:
                self.excel_data.append(dt)
        # print(json.dumps(self.keys, ensure_ascii=False))
        # print(json.dumps(self.excel_data, ensure_ascii=False))

    # 执行入口
    def run(self):
        self.traverse_excel()
